#ifndef __SOCKETRECVBUFF_HEADER
#define __SOCKETRECVBUFF_HEADER

#include "buff.h"
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


/*
 socket接收信息时使用的缓冲区，只有监听进程会使用它
 接收信息的规则：
 1.先接收HEADER_SIZE的报头  
 2.给过滤模块过滤报头正确性
 3.提取OJ名称，body长度这两个字段
 4.接收body

 状态机转移：
 status=0，还没完全接收header
 status=1，完全接收header，还没完全接收body
 status=2，完全接收body
 */

struct SocketRecvBuff: public Buff {
	static const size_t HEADER_SIZE;
	static const size_t FIELD_SIZE;
	static const size_t MAX_BODY_SIZE;

	char *header;
	char *body;
	char *oj;
	size_t body_length;
	int status;
	int index;
	int remain;

	SocketRecvBuff();
	~SocketRecvBuff();
	
	/* 
	   返回0对端socket关闭
	   返回-1出错，查看errno
	   返回正数是本次成功接收的字节数
	 */
	ssize_t recv_header(int fd);
	ssize_t recv_body(int fd);

	/* 判断函数，是否完整接收header或body */
	bool finish_header();
	bool finish_body();

	/* 在完整接收头部，并且过滤模块成功过滤后调用
	   从header中提取oj和body_length字段
	 */
	void get_oj();
	void get_body_length();

	/* 
	   当前版本中一个SocketRecvBuff不会被重用，reset函数没用
	   下一步优化版本中，SocketRecvBuff会被重用，避免频繁申请释放内存
	   该函数将整个缓冲区重置为刚构造完时的状态
	 */
	//void reset();
};

#endif // __SOCKETRECVBUFF_HEADER
